Skip to content

feat(dl): column resizing (#DS-4609) - #1895

Merged
artembelik merged 11 commits into
mainfrom
feat/DS-4609
Aug 25, 2026
Merged

feat(dl): column resizing (#DS-4609)#1895
artembelik merged 11 commits into
mainfrom
feat/DS-4609

Conversation

@artembelik

Copy link
Copy Markdown
Contributor

No description provided.

@artembelik artembelik self-assigned this Aug 13, 2026
@artembelik
artembelik requested a review from lskramarov as a code owner August 13, 2026 14:32
Copilot AI lite review requested due to automatic review settings August 13, 2026 14:32
@github-actions github-actions Bot added the enhancement New feature or request label Aug 13, 2026
@github-actions

github-actions Bot commented Aug 13, 2026

Copy link
Copy Markdown

Visit the preview URL for this PR (updated for commit d368bc6):

https://koobiq-next--prs-1895-7uegobeu.web.app

(expires Fri, 28 Aug 2026 13:36:46 GMT)

🔥 via Firebase Hosting GitHub Action 🌎

Sign: c9e37e518febda70d0317d07e8ceb35ac43c534c

@artembelik
artembelik requested a review from NikGurev August 14, 2026 07:17
Comment thread packages/components/dl/dl.ru.md Outdated
Comment thread packages/components/dl/dl.component.ts
@artembelik
artembelik requested a review from rmnturov August 20, 2026 07:45
@rmnturov

Copy link
Copy Markdown
Contributor

Пример нужно изменить, чтобы минимальная ширина и ширина по умолчанию отличались. Нужен пример, который наглядно покажет, как по двойному клику меняется ширина. Минимальную ширину сделать в районе 100px.

@rmnturov

rmnturov commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Нужен пример, где ширина меняется между несколькими списками DL. В продуктах есть кейс, где списки располагаются внутри аккордеонов.

Сделал макет примера
https://www.figma.com/design/wHiyNIQkBkoomLDLEJEecV/%F0%9F%9F%A5-koobiq-%C2%B7-components-20?node-id=69105-9008&t=poyCPRQTAKSItvm3-4
image

@rmnturov

Copy link
Copy Markdown
Contributor

По обработке курсоров есть несоответствие гайду. В разделе «Курсор» указано, что курсор должен показывать не только возможность изменения размера (col-resize), но и доступное направление: e-resize при минимальной ширине панели, w-resize при максимальной, default, если изменить размер невозможно.

Сейчас в kbq-dl всегда передаётся cursor="col-resize", поэтому при достижении min/max пользователь не получает обратной связи. Предлагаю вычислять курсор на основе текущей ширины и ограничений, обновлять его во время drag и учитывать RTL.

@rmnturov

Copy link
Copy Markdown
Contributor

В момент перетаскивания полоска должна становиться толстой. На стилизацию состояния Focus тоже надо обратить внимание
image
https://www.figma.com/design/wHiyNIQkBkoomLDLEJEecV/%F0%9F%9F%A5-koobiq-%C2%B7-components-20?node-id=68743-15136&t=poyCPRQTAKSItvm3-4

@rmnturov

Copy link
Copy Markdown
Contributor

появление рамки фокуса должно быть без анимации, мгновенно

@rmnturov

Copy link
Copy Markdown
Contributor

dl.scss:104–107: hover-эффект не учитывает тип устройства

Полезно ограничить появление линии при наведении @media (hover: hover) and (pointer: fine). На touch-устройствах :hover может срабатывать после касания и оставлять линию видимой после завершения взаимодействия.

@artembelik

Copy link
Copy Markdown
Contributor Author

Нужен пример, где ширина меняется между несколькими списками DL

добавил пример с двумя списками

@artembelik

Copy link
Copy Markdown
Contributor Author

По обработке курсоров есть несоответствие гайду. В разделе «Курсор» указано, что курсор должен показывать не только возможность изменения размера (col-resize), но и доступное направление: e-resize при минимальной ширине панели, w-resize при максимальной, default, если изменить размер невозможно.

Сейчас в kbq-dl всегда передаётся cursor="col-resize", поэтому при достижении min/max пользователь не получает обратной связи. Предлагаю вычислять курсор на основе текущей ширины и ограничений, обновлять его во время drag и учитывать RTL.

поправил

@rmnturov

rmnturov commented Aug 24, 2026

Copy link
Copy Markdown
Contributor
  1. двойной клик → колонка стала уже
  2. двойной клик → колонка вернулась к дефолтной ширине, стала шире.
  3. cursor стал e-resize

Ожидаю, что курсор будет col-resize, тк колонку можно сделать как более узкой, так и расширить

dl-column-resize-cursor-bug.mp4

@rmnturov

Copy link
Copy Markdown
Contributor

Фокус на полоске. Вокруг полоски видна рамка. Начал тянуть: вижу рамку и синюю полоску. Взаимодействие идет мышкой: ожидаю, что рамка скроется. Будет полоска синего цвета в момент перетаскивания

@artembelik

artembelik commented Aug 24, 2026

Copy link
Copy Markdown
Contributor Author

Фокус на полоске. Вокруг полоски видна рамка. Начал тянуть: вижу рамку и синюю полоску. Взаимодействие идет мышкой: ожидаю, что рамка скроется. Будет полоска синего цвета в момент перетаскивания

после фокуса с клавиатуры в момент перетаскивания фокус сохраняется, поэтому и рамку видно, можно програмно принудительно скрывать рамку при перетаскивании, но как быть при перетаскивании стрелками? в этот момент фокус должен быть виден?

upd. скрыл рамку в момент перетаскивания мышью

@artembelik

Copy link
Copy Markdown
Contributor Author

Ожидаю, что курсор будет ew-resize, тк колонка можно сделать как более узкой, так и расширить

баг, поправлю

@rmnturov

Copy link
Copy Markdown
Contributor

Ожидаю, что курсор будет ew-resize, тк колонка можно сделать как более узкой, так и расширить

баг, поправлю

я имел в виду col-resize — ранее я неправильно написал

@rmnturov

Copy link
Copy Markdown
Contributor

Фокус на полоске. Вокруг полоски видна рамка. Начал тянуть: вижу рамку и синюю полоску. Взаимодействие идет мышкой: ожидаю, что рамка скроется. Будет полоска синего цвета в момент перетаскивания

после фокуса с клавиатуры в момент перетаскивания фокус сохраняется, поэтому и рамку видно, можно програмно принудительно скрывать рамку при перетаскивании, но как быть при перетаскивании стрелками? в этот момент фокус должен быть виден?

upd. скрыл рамку в момент перетаскивания мышью

Я вижу поведение так: рамка показывает клавиатурное управление. Сам фокус снимать не нужно.

  1. Клавиатурный фокус на полоске-разелителе — рамка видна.
  2. Ресайз мышью — рамка скрыта, а полоска толстая и синяя.
  3. Ресайз стрелками — рамка видна.
  4. Tab — рамка на полоске скрыта, на новом элементе показана.
  5. Ресайз полоски мышью — рамки нет, линия жирная и синяя.
  6. Tab — фокус на сл. элементе, его рамка видна.
  7. Shift+Tab — фокус возвращается на полоску, рамка снова видна.

Мышка — синяя полоска без рамки, клавиатура — полоска с рамкой.
Что думаешь? Понятно рассказал?

@artembelik

Copy link
Copy Markdown
Contributor Author

я имел в виду col-resize — ранее я неправильно написал

поправил

@artembelik

Copy link
Copy Markdown
Contributor Author

Я вижу поведение так: рамка показывает клавиатурное управление. Сам фокус снимать не нужно.

  1. Клавиатурный фокус на полоске-разелителе — рамка видна.
  2. Ресайз мышью — рамка скрыта, а полоска толстая и синяя.
  3. Ресайз стрелками — рамка видна.
  4. Tab — рамка на полоске скрыта, на новом элементе показана.
  5. Ресайз полоски мышью — рамки нет, линия жирная и синяя.
  6. Tab — фокус на сл. элементе, его рамка видна.
  7. Shift+Tab — фокус возвращается на полоску, рамка снова видна.

Мышка — синяя полоска без рамки, клавиатура — полоска с рамкой.

готово

@rmnturov

Copy link
Copy Markdown
Contributor

Заметил некорректное изменение курсора при ресайзе: когда колонка достигает минимальной или максимальной ширины и дальше уже не меняется, курсор сбрасывается на default.

Я изучил поведение в macOS и веб-приложении Figma: пока пользователь удерживает кнопку мыши и продолжает drag, курсор остаётся связанным с ресайзом, даже если достигнут предел. Это логично: жест ещё не завершён, а колонку можно сразу потянуть в обратную сторону.

Затем я обратился к ИИ. Его вывод:

Во время активного drag не стоит переключать курсор на default только потому, что колонка достигла min или max. Базовый контракт — сохранять resize-курсор до pointerup / pointercancel.

На границе можно показывать доступное направление через e-resize / w-resize, но default уместен только когда ресайз полностью недоступен в обе стороны.

Курсор нужно задавать не только на handle. Когда ручка упирается в предел, она перестаёт двигаться, а указатель может выйти из её hit-area — тогда браузер показывает курсор нижележащего элемента. На время drag cursor следует устанавливать на общий контейнер или document.body и сбрасывать при завершении жеста.

Нужно доработать это поведение и покрыть тестами сценарии: достижение min/max, дальнейшее движение указателя за ручку, возврат в доступный диапазон и сброс cursor после завершения drag.

@rmnturov

Copy link
Copy Markdown
Contributor

Записал видос про смену курсора

dl-colresize-cursor-bug.mp4

@rmnturov

rmnturov commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Вот еще про ховеры на другие элементы при ресайзе. Это типа то же самое, что я Лёне говорил в PR про list drag-sort #1911 (comment)

Думаю, что это можно отдельно доработать

Во время активного ресайза другие элементы не должны реагировать на hover: ни подсветка кнопок, ни тултипы, ни pointer-курсор.
Нужен глобальный прозрачный drag-shield поверх viewport:

  • появляется на pointerdown;
  • имеет cursor: col-resize или направленный e/w-resize;
  • перехватывает hit-testing, поэтому кнопка под курсором не получает :hover и клики;
  • убирается на pointerup, pointercancel, blur и при уничтожении компонента.
    Одного document.body.style.cursor недостаточно: курсор сохранится, но CSS :hover на кнопке под указателем всё равно сработает.
    Фокус клавиатуры при этом не снимаем: shield нужен только для pointer-drag.

@rmnturov

Copy link
Copy Markdown
Contributor

Я вижу поведение так: рамка показывает клавиатурное управление. Сам фокус снимать не нужно.

  1. Клавиатурный фокус на полоске-разелителе — рамка видна.
  2. Ресайз мышью — рамка скрыта, а полоска толстая и синяя.
  3. Ресайз стрелками — рамка видна.
  4. Tab — рамка на полоске скрыта, на новом элементе показана.
  5. Ресайз полоски мышью — рамки нет, линия жирная и синяя.
  6. Tab — фокус на сл. элементе, его рамка видна.
  7. Shift+Tab — фокус возвращается на полоску, рамка снова видна.

Мышка — синяя полоска без рамки, клавиатура — полоска с рамкой.

готово

После ресайза мышкой не должно остаться видимой рамки

@rmnturov

Copy link
Copy Markdown
Contributor
  • убраны избыточные уточнения про горизонтальный режим: понятие колонок не оставляет разночтений;
  • убраны шорткаты и дополнительные сценарии взаимодействия, поскольку они будут общими для всех сплиттеров;
  • подробнее описано назначение привязки [(dtWidth)];
  • раздел про изменение ширины перемещен в конец статьи как описание дополнительной возможности.

@artembelik

Copy link
Copy Markdown
Contributor Author

Вот еще про ховеры на другие элементы при ресайзе. Это типа то же самое, что я Лёне говорил в PR про list drag-sort #1911 (comment)

Думаю, что это можно отдельно доработать

создал отдельную задачу DS-5463

@artembelik

Copy link
Copy Markdown
Contributor Author

Заметил некорректное изменение курсора при ресайзе: когда колонка достигает минимальной или максимальной ширины и дальше уже не меняется, курсор сбрасывается на default.

поправил

artembelik and others added 10 commits August 25, 2026 15:36
- убраны избыточные уточнения про горизонтальный режим: понятие колонок не оставляет разночтений;
- убраны шорткаты и дополнительные сценарии взаимодействия, поскольку они будут общими для всех сплиттеров;
- подробнее описано назначение привязки [(dtWidth)];
- раздел про изменение ширины перемещен в конец статьи как описание дополнительной возможности.
- removed redundant horizontal-mode clarification;
- removed shortcut and click descriptions shared across splitters;
- explained use cases for `[(dtWidth)]`;
- moved the section to the end as an additional feature.
@artembelik

Copy link
Copy Markdown
Contributor Author

После ресайза мышкой не должно остаться видимой рамки

поправил

@github-actions

Copy link
Copy Markdown

🚨 E2E tests failed

Review the report for details.


💡 Comment /approve-snapshots to approve snapshot changes.

@artembelik
artembelik merged commit f423961 into main Aug 25, 2026
13 checks passed
@artembelik
artembelik deleted the feat/DS-4609 branch August 25, 2026 13:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants